﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIMCObjetoNegocio;

namespace SIMCRepositorio
{
    public interface IRepositorioUsuario
    {
        Usuario BuscarUsuario(string p_Login);
        Usuario BuscarUsuario(int p_IdUsuario);
        IList<Usuario> BuscarListaUsuarioExterno(string p_Login, string p_Nombre, string p_Email);
        IList<Rol> BuscarRolesUsuario(int p_UsuarioId);
        Rol BuscarRolUsuarioPorDefecto(int p_IdUsuario);
        void ActualizarRolPorDefecto(int p_IdUsuario, string p_IdNuevoRol);

        List<Rol> BuscarRoles();
    }

    public class RepositorioUsuario : Database, IRepositorioUsuario
    {
        public Usuario BuscarUsuario(string p_Login)
        {
            try

            {
                var query = from usuario in Context.per_naturales
                            join persona in Context.per_personas
                                on usuario.per_icodigo equals persona.per_icodigo
                            join atributo in Context.per_atributos
                                on usuario.per_icodigo equals atributo.cla_ipersona
                            where usuario.pna_slogin == p_Login
                            && persona.per_ctipo == Valores.PersonaNatural
                            && atributo.cla_satributo == Valores.TipoPersona
                            && atributo.cla_svalor == Valores.TipoPersonaUsuario
                            select new Usuario
                            {
                                NombreCorto = persona.per_sncorto,
                                Id = persona.per_icodigo,
                                Login = usuario.pna_slogin,
                                _TipoUsuario = 1,
                                Password = usuario.pna_spwd,
                                Email = usuario.pna_semail.Length == 0 ? Valores.NoDisponible : usuario.pna_semail
                            };

                return query.SingleOrDefault();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public Usuario BuscarUsuario(int p_IdUsuario)
        {
            try
            {
                var query = from usuario in Context.per_naturales
                            join persona in Context.per_personas
                                on usuario.per_icodigo equals persona.per_icodigo
                            join atributo in Context.per_atributos
                                on usuario.per_icodigo equals atributo.cla_ipersona
                            where atributo.cla_ipersona == p_IdUsuario
                            && persona.per_ctipo == Valores.PersonaNatural
                            && atributo.cla_satributo == Valores.TipoPersona
                            && atributo.cla_svalor == Valores.TipoPersonaUsuario
                            select new Usuario
                            {
                                NombreCorto = persona.per_sncorto,
                                Id = persona.per_icodigo,
                                Login = usuario.pna_slogin,
                                _TipoUsuario = 1,
                                Password = usuario.pna_spwd,
                                Email = usuario.pna_semail.Length == 0 ? Valores.NoDisponible : usuario.pna_semail
                            };

                return query.SingleOrDefault();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        [Obsolete]
        public IList<Usuario> BuscarListaUsuarioExterno(string p_Login, string p_Nombre, string p_Email)
        {
            try
            {
                var query = from usuario in Context.per_naturales
                            join persona in Context.per_personas
                                on usuario.per_icodigo equals persona.per_icodigo
                            join atributo in Context.per_atributos
                                on usuario.per_icodigo equals atributo.cla_ipersona
                            where usuario.pna_slogin == p_Login
                            && persona.per_ctipo == Valores.PersonaNatural
                            && atributo.cla_satributo == Valores.TipoPersona
                            && atributo.cla_svalor == Valores.TipoPersonaUsuario
                            select new Usuario
                            {
                                NombreCorto = persona.per_sncorto,
                                Id = persona.per_icodigo,
                                Login = usuario.pna_slogin,
                                _TipoUsuario = 1,
                                Password = usuario.pna_spwd,
                                Email = usuario.pna_semail.Length == 0 ? Valores.NoDisponible : usuario.pna_semail
                            };

                return query.ToList();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public IList<Rol> BuscarRolesUsuario(int p_UsuarioId)
        {
            try
            {
                IRepositorioAtributoPersona m_Repository = DatabaseAccess.AtributoPersonaRepositorio;
                List<ClasificacionPersonas> clasificaciones = m_Repository.Buscar(p_UsuarioId, Valores.GrupoUsuarios);

                IList<Rol> roles = new List<Rol>();

                foreach (ClasificacionPersonas clas in clasificaciones)
                {
                    if (EsRolWeb(clas.CalificadoresValores[0]))
                    {
                        Rol rol = new Rol
                        {
                            Id = clas.ValorDelAtributo,
                            Descripcion = clas.DescripcionValor
                        };

                        roles.Add(rol);
                    }
                }

                return roles;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private bool EsRolWeb(string valor)
        {
            return valor == "1";
        }

        public List<Rol> BuscarRoles()
        {
            try
            {
                IRepositorioValor m_Repository = DatabaseAccess.ValorRepositorio;
                List<ValorDeAtributo> valores = m_Repository.BuscarLista(Valores.GrupoUsuarios);

                List<Rol> roles = new List<Rol>();

                foreach (ValorDeAtributo val in valores)
                {
                    if (EsRolWeb(val.cav_scal1))
                    {
                        Rol rol = new Rol
                                    {
                                        Id = val.Valor,
                                        Descripcion = val.Descripcion
                                    };

                        roles.Add(rol); 
                    }
                }

                return roles;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public Rol BuscarRolUsuarioPorDefecto(int p_IdUsuario)
        {
            try
            {
                IRepositorioAtributoPersona atributoRepositorio = DatabaseAccess.AtributoPersonaRepositorio;

                List<ClasificacionPersonas> roles = atributoRepositorio.Buscar(p_IdUsuario,Valores.GrupoUsuarios);

                ClasificacionPersonas clasifPersona = null;

                foreach (ClasificacionPersonas clasif in roles)
                {
                    int indice = 0;
                    
                    foreach (CalificadorDeAtributo califAtributo in clasif.CalificadoresAtributoDef)
                    {
                        if ((califAtributo.Id == 1))//buscando el primer calificador (C01) "PerfilWebPorDefecto"
                        {
                            break;
                        }
                        indice++;
                    }
                    if ((clasif.CalificadoresAtributo.Count >= indice) && (clasif.CalificadoresAtributo.Count > 0))
                    {
                        if (clasif.CalificadoresAtributo[indice] == "1")//Revisando si es el perfil por defecto
                        {
                            clasifPersona = clasif;
                            break;
                        }
                    }
                    else//Si se detecta que no existe un valor para el perfilwebpordefecto hay que colocarle 0
                    {
                        clasif._CalificadoresAtributo = "0";
                        atributoRepositorio.Guardar(clasif);
                    }
                }

                if (clasifPersona != null)
                {
                    return new Rol
                    {
                        Id = clasifPersona.ValorDelAtributo,
                        Descripcion = clasifPersona.DescripcionValor
                    };
                
                }

                return null;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

       public void ActualizarRolPorDefecto(int p_IdUsuario, string p_IdNuevoRol)
        {
            try
            {
                IRepositorioAtributoPersona atributoRepositorio = DatabaseAccess.AtributoPersonaRepositorio;

                List<ClasificacionPersonas> clasificaciones = atributoRepositorio.Buscar(p_IdUsuario,Valores.GrupoUsuarios);

                int indicePerfilWebPorDefecto = 0;
                IQueryable<CalificadorDeAtributo> temp = clasificaciones[0].CalificadoresAtributoDef.AsQueryable();

                var anotherTemp = temp.Where(x => x.Id == 1).FirstOrDefault();

                indicePerfilWebPorDefecto = clasificaciones[0].CalificadoresAtributoDef.IndexOf(anotherTemp);
            
                foreach (ClasificacionPersonas clasif in clasificaciones)
                {
                    List<string> listaCalifAtributo = clasif.CalificadoresAtributo;
                    if (listaCalifAtributo.Count > 0)
                    {
                        if (clasif.ValorDelAtributo == p_IdNuevoRol)
                        {
                            listaCalifAtributo[indicePerfilWebPorDefecto] = "1";
                            clasif.CalificadoresAtributo = listaCalifAtributo;
                            atributoRepositorio.Guardar(clasif);
                        }
                        else
                        { 
                            listaCalifAtributo[indicePerfilWebPorDefecto] = "0";
                            clasif.CalificadoresAtributo = listaCalifAtributo;
                            atributoRepositorio.Guardar(clasif);
                        }
                    }
                }
                
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
    }
}
